home *** CD-ROM | disk | FTP | other *** search
-
- Listing 5
- ********
-
- /* A header file */
-
- struct s_number
- {
- int number_of_elements;
- int overflow; /* Overflow (single bit) */
- int sign; /* Sign (0 = positive, 1 = negative) */
- long int element[]; /* Kept in least significant first order */
- };
- typedef struct s_number *NUMBER;
-
- NUMBER new_number(long initial_long_value);
- NUMBER add_numbers(NUMBER add1, NUMBER add2);
-
- /* This is a short program with its use */
-
- main()
- {
- NUMBER first_number;
- NUMBER second_number;
- NUMBER sum;
-
- first_number = new_number(10000);
- second_number = new_number(10000);
- sum = add_numbers(first_number, second_number);
- }
-
- /* The routines */
-
- NUMBER new_number(NUMBER number, long initial_long_value)
- {
- number = calloc(sizeof(struct s_number) + 1, 1);
- if (number != NULL)
- {
- number->number_of_elements = 1;
- number->element[0] = initial_long_value;
- }
- return number;
- }
-
- NUMBER add_numbers(NUMBER add1, NUMBER add2)
- {
- NUMBER sum;
- int size_sum; /* Size of result */
- int size_count; /* Size of smaller addend */
- int i;
- int overflow;
- int sign;
- int which_is_bigger;
-
- /* Should check for overflow here and increase size_sum */
- if (add1->number_of_elements > add2->number_of_elements)
- {
- size_sum = add1->number_of_elements;
- size_count = add2->number_of_elements;
- which_is_bigger = 1;
- }
- else
- {
- size_count = add1->number_of_elements;
- size_sum = add2->number_of_elements;
- which_is_bigger = 2;
- }
-
- /* Get a place for the result */
- sum = calloc(sizeof(struct s_number) + size_sum, 1);
-
- /* Do the addition - will need to check for overflow, sign, etc. */
- for (i = 0; i < size_count++; i++)
- {
- /* Need to check for overflow */
- sum->element[i] = add1->element[i] + add2->element[i] +
- overflow;
- }
-
- /* Do the remainder of the larger addend */
- for (i = size_count; i < size_sum; i++)
- {
- if (which_is_bigger == 1)
- sum->element[i] = add1->element[i] + overflow;
- else
- sum->element[i] = add2->element[i] + overflow;
- overflow = 0;
- }
-
- /* Need to test overflow of the larger addend and set sum here */
-
- return sum;
- }
-
-